package com.osgix.common.utils;

public class AryConverter {

	// converts integer n into a base b string
	public static String toString(int n, int base) {
		// special case
		if (n == 0)
			return "0";

		String digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		String s = "";
		while (n > 0) {
			int d = n % base;
			s = digits.charAt(d) + s;
			n = n / base;
		}
		return s;
	}

	public static String toBinaryString(int n) {
		return toString(n, 2);
	}

	public static String toHexString(int n) {
		return toString(n, 16);
	}

	public static void inputError(String s) {
		throw new RuntimeException("Input error with" + s);
	}

	// convert a String representing a base b integer into an int
	public static int fromString(String s, int b) {
		int result = 0;
		int digit = 0;
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (c >= '0' && c <= '9')
				digit = c - '0';
			else if (c >= 'A' && c <= 'Z')
				digit = 10 + c - 'A';
			else
				inputError(s);

			if (digit < b)
				result = b * result + digit;
			else
				inputError(s);
		}
		return result;
	}

	public static int fromBinaryString(String s) {
		return fromString(s, 2);
	}

	public static int fromHexString(String s) {
		return fromString(s, 16);
	}

	// sample test client
	public static void main(String[] args) {
		int n = 47;
		String s = "101111";
		System.out.println(n + ":  " + toBinaryString(n));
		System.out.println(s + ":  " + fromBinaryString(s));
		System.out.println(n + ":  " + toHexString(n));
		System.out.println();

		n = 2620;
		s = "0A3C";
		System.out.println(n + ":  " + toBinaryString(n));
		System.out.println(s + ":  " + fromHexString(s));
		System.out.println(n + ":  " + toHexString(n));
	}
}
